/* NEON builtin definitions for ARM.
   Copyright (C) 2013-2015 Free Software Foundation, Inc.
   Contributed by ARM Ltd.

   This file is part of GCC.

   GCC is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published
   by the Free Software Foundation; either version 3, or (at your
   option) any later version.

   GCC is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
   License for more details.

   You should have received a copy of the GNU General Public License
   along with GCC; see the file COPYING3.  If not see
   <http://www.gnu.org/licenses/>.  */

VAR2 (BINOP, vadd, v2sf, v4sf)
VAR3 (BINOP, vaddls, v8qi, v4hi, v2si)
VAR3 (BINOP, vaddlu, v8qi, v4hi, v2si)
VAR3 (BINOP, vaddws, v8qi, v4hi, v2si)
VAR3 (BINOP, vaddwu, v8qi, v4hi, v2si)
VAR6 (BINOP, vhaddu, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (BINOP, vhadds, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (BINOP, vrhaddu, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (BINOP, vrhadds, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR8 (BINOP, vqadds, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (BINOP, vqaddu, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR3 (BINOP, vaddhn, v8hi, v4si, v2di)
VAR3 (BINOP, vraddhn, v8hi, v4si, v2di)
VAR2 (BINOP, vmulf, v2sf, v4sf)
VAR2 (BINOP, vmulp, v8qi, v16qi)
VAR8 (TERNOP, vmla, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf)
VAR3 (TERNOP, vmlals, v8qi, v4hi, v2si)
VAR3 (TERNOP, vmlalu, v8qi, v4hi, v2si)
VAR2 (TERNOP, vfma, v2sf, v4sf)
VAR2 (TERNOP, vfms, v2sf, v4sf)
VAR8 (TERNOP, vmls, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf)
VAR3 (TERNOP, vmlsls, v8qi, v4hi, v2si)
VAR3 (TERNOP, vmlslu, v8qi, v4hi, v2si)
VAR4 (BINOP, vqdmulh, v4hi, v2si, v8hi, v4si)
VAR4 (BINOP, vqrdmulh, v4hi, v2si, v8hi, v4si)
VAR2 (TERNOP, vqdmlal, v4hi, v2si)
VAR2 (TERNOP, vqdmlsl, v4hi, v2si)
VAR3 (BINOP, vmullp, v8qi, v4hi, v2si)
VAR3 (BINOP, vmulls, v8qi, v4hi, v2si)
VAR3 (BINOP, vmullu, v8qi, v4hi, v2si)
VAR2 (BINOP, vmulls_n, v4hi, v2si)
VAR2 (BINOP, vmullu_n, v4hi, v2si)
VAR2 (SETLANE, vmulls_lane, v4hi, v2si)
VAR2 (SETLANE, vmullu_lane, v4hi, v2si)
VAR2 (BINOP, vqdmull_n, v4hi, v2si)
VAR2 (SETLANE, vqdmull_lane, v4hi, v2si)
VAR4 (BINOP, vqdmulh_n, v4hi, v2si, v8hi, v4si)
VAR4 (BINOP, vqrdmulh_n, v4hi, v2si, v8hi, v4si)
VAR4 (SETLANE, vqdmulh_lane, v4hi, v2si, v8hi, v4si)
VAR4 (SETLANE, vqrdmulh_lane, v4hi, v2si, v8hi, v4si)
VAR2 (BINOP, vqdmull, v4hi, v2si)
VAR8 (BINOP, vshls, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (BINOP, vshlu, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (BINOP, vrshls, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (BINOP, vrshlu, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (BINOP, vqshls, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (BINOP, vqshlu, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (BINOP, vqrshls, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (BINOP, vqrshlu, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (GETLANE, vshrs_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (GETLANE, vshru_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (GETLANE, vrshrs_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (GETLANE, vrshru_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR3 (GETLANE, vshrn_n, v8hi, v4si, v2di)
VAR3 (GETLANE, vrshrn_n, v8hi, v4si, v2di)
VAR3 (GETLANE, vqshrns_n, v8hi, v4si, v2di)
VAR3 (GETLANE, vqshrnu_n, v8hi, v4si, v2di)
VAR3 (GETLANE, vqrshrns_n, v8hi, v4si, v2di)
VAR3 (GETLANE, vqrshrnu_n, v8hi, v4si, v2di)
VAR3 (GETLANE, vqshrun_n, v8hi, v4si, v2di)
VAR3 (GETLANE, vqrshrun_n, v8hi, v4si, v2di)
VAR8 (GETLANE, vshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (GETLANE, vqshl_s_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (GETLANE, vqshl_u_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (GETLANE, vqshlu_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR3 (GETLANE, vshlls_n, v8qi, v4hi, v2si)
VAR3 (GETLANE, vshllu_n, v8qi, v4hi, v2si)
VAR8 (SETLANE, vsras_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (SETLANE, vsrau_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (SETLANE, vrsras_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (SETLANE, vrsrau_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR2 (BINOP, vsub, v2sf, v4sf)
VAR3 (BINOP, vsubls, v8qi, v4hi, v2si)
VAR3 (BINOP, vsublu, v8qi, v4hi, v2si)
VAR3 (BINOP, vsubws, v8qi, v4hi, v2si)
VAR3 (BINOP, vsubwu, v8qi, v4hi, v2si)
VAR8 (BINOP, vqsubs, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (BINOP, vqsubu, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR6 (BINOP, vhsubs, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (BINOP, vhsubu, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR3 (BINOP, vsubhn, v8hi, v4si, v2di)
VAR3 (BINOP, vrsubhn, v8hi, v4si, v2di)
VAR8 (BINOP, vceq, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf)
VAR8 (BINOP, vcge, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf)
VAR6 (BINOP, vcgeu, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR8 (BINOP, vcgt, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf)
VAR6 (BINOP, vcgtu, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR2 (BINOP, vcage, v2sf, v4sf)
VAR2 (BINOP, vcagt, v2sf, v4sf)
VAR6 (BINOP, vtst, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (BINOP, vabds, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (BINOP, vabdu, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR2 (BINOP, vabdf, v2sf, v4sf)
VAR3 (BINOP, vabdls, v8qi, v4hi, v2si)
VAR3 (BINOP, vabdlu, v8qi, v4hi, v2si)

VAR6 (TERNOP, vabas, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (TERNOP, vabau, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR3 (TERNOP, vabals, v8qi, v4hi, v2si)
VAR3 (TERNOP, vabalu, v8qi, v4hi, v2si)

VAR6 (BINOP, vmaxs, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (BINOP, vmaxu, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR2 (BINOP, vmaxf, v2sf, v4sf)
VAR6 (BINOP, vmins, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (BINOP, vminu, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR2 (BINOP, vminf, v2sf, v4sf)

VAR3 (BINOP, vpmaxs, v8qi, v4hi, v2si)
VAR3 (BINOP, vpmaxu, v8qi, v4hi, v2si)
VAR1 (BINOP, vpmaxf, v2sf)
VAR3 (BINOP, vpmins, v8qi, v4hi, v2si)
VAR3 (BINOP, vpminu, v8qi, v4hi, v2si)
VAR1 (BINOP, vpminf, v2sf)

VAR4 (BINOP, vpadd, v8qi, v4hi, v2si, v2sf)
VAR6 (UNOP, vpaddls, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (UNOP, vpaddlu, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (BINOP, vpadals, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (BINOP, vpadalu, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR2 (BINOP, vrecps, v2sf, v4sf)
VAR2 (BINOP, vrsqrts, v2sf, v4sf)
VAR8 (SETLANE, vsri_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (SETLANE, vsli_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di)
VAR8 (UNOP, vabs, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf)
VAR6 (UNOP, vqabs, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR8 (UNOP, vneg, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf)
VAR6 (UNOP, vqneg, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (UNOP, vcls, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR6 (UNOP, vclz, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR5 (BSWAP, bswap, v4hi, v8hi, v2si, v4si, v2di)
VAR2 (UNOP, vcnt, v8qi, v16qi)
VAR4 (UNOP, vrecpe, v2si, v2sf, v4si, v4sf)
VAR4 (UNOP, vrsqrte, v2si, v2sf, v4si, v4sf)
VAR6 (UNOP, vmvn, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
  /* FIXME: vget_lane supports more variants than this!  */
VAR10 (GETLANE, vget_lane,
	 v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
VAR6 (GETLANE, vget_laneu, v8qi, v4hi, v2si, v16qi, v8hi, v4si)
VAR10 (SETLANE, vset_lane,
	 v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
VAR5 (UNOP, vcreate, v8qi, v4hi, v2si, v2sf, di)
VAR10 (UNOP, vdup_n,
	 v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
VAR10 (BINOP, vdup_lane,
	 v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
VAR5 (COMBINE, vcombine, v8qi, v4hi, v2si, v2sf, di)
VAR5 (UNOP, vget_high, v16qi, v8hi, v4si, v4sf, v2di)
VAR5 (UNOP, vget_low, v16qi, v8hi, v4si, v4sf, v2di)
VAR3 (UNOP, vmovn, v8hi, v4si, v2di)
VAR3 (UNOP, vqmovns, v8hi, v4si, v2di)
VAR3 (UNOP, vqmovnu, v8hi, v4si, v2di)
VAR3 (UNOP, vqmovun, v8hi, v4si, v2di)
VAR3 (UNOP, vmovls, v8qi, v4hi, v2si)
VAR3 (UNOP, vmovlu, v8qi, v4hi, v2si)
VAR6 (SETLANE, vmul_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf)
VAR6 (LANEMAC, vmla_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf)
VAR2 (LANEMAC, vmlals_lane, v4hi, v2si)
VAR2 (LANEMAC, vmlalu_lane, v4hi, v2si)
VAR2 (LANEMAC, vqdmlal_lane, v4hi, v2si)
VAR6 (LANEMAC, vmls_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf)
VAR2 (LANEMAC, vmlsls_lane, v4hi, v2si)
VAR2 (LANEMAC, vmlslu_lane, v4hi, v2si)
VAR2 (LANEMAC, vqdmlsl_lane, v4hi, v2si)
VAR6 (BINOP, vmul_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf)
VAR6 (LANEMAC, vmla_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf)
VAR2 (LANEMAC, vmlals_n, v4hi, v2si)
VAR2 (LANEMAC, vmlalu_n, v4hi, v2si)
VAR2 (LANEMAC, vqdmlal_n, v4hi, v2si)
VAR6 (LANEMAC, vmls_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf)
VAR2 (LANEMAC, vmlsls_n, v4hi, v2si)
VAR2 (LANEMAC, vmlslu_n, v4hi, v2si)
VAR2 (LANEMAC, vqdmlsl_n, v4hi, v2si)
VAR10 (SETLANE, vext,
	 v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
VAR8 (UNOP, vrev64, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf)
VAR4 (UNOP, vrev32, v8qi, v4hi, v16qi, v8hi)
VAR2 (UNOP, vrev16, v8qi, v16qi)
VAR4 (UNOP, vcvts, v2si, v2sf, v4si, v4sf)
VAR4 (UNOP, vcvtu, v2si, v2sf, v4si, v4sf)
VAR4 (BINOP, vcvts_n, v2si, v2sf, v4si, v4sf)
VAR4 (BINOP, vcvtu_n, v2si, v2sf, v4si, v4sf)
VAR1 (UNOP, vcvtv4sf, v4hf)
VAR1 (UNOP, vcvtv4hf, v4sf)
VAR10 (TERNOP, vbsl,
	 v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
VAR2 (UNOP, copysignf, v2sf, v4sf)
VAR2 (UNOP, vrintn, v2sf, v4sf)
VAR2 (UNOP, vrinta, v2sf, v4sf)
VAR2 (UNOP, vrintp, v2sf, v4sf)
VAR2 (UNOP, vrintm, v2sf, v4sf)
VAR2 (UNOP, vrintz, v2sf, v4sf)
VAR2 (UNOP, vrintx, v2sf, v4sf)
VAR1 (UNOP, vcvtav2sf, v2si)
VAR1 (UNOP, vcvtav4sf, v4si)
VAR1 (UNOP, vcvtauv2sf, v2si)
VAR1 (UNOP, vcvtauv4sf, v4si)
VAR1 (UNOP, vcvtpv2sf, v2si)
VAR1 (UNOP, vcvtpv4sf, v4si)
VAR1 (UNOP, vcvtpuv2sf, v2si)
VAR1 (UNOP, vcvtpuv4sf, v4si)
VAR1 (UNOP, vcvtmv2sf, v2si)
VAR1 (UNOP, vcvtmv4sf, v4si)
VAR1 (UNOP, vcvtmuv2sf, v2si)
VAR1 (UNOP, vcvtmuv4sf, v4si)
VAR1 (COMBINE, vtbl1, v8qi)
VAR1 (COMBINE, vtbl2, v8qi)
VAR1 (COMBINE, vtbl3, v8qi)
VAR1 (COMBINE, vtbl4, v8qi)
VAR1 (TERNOP, vtbx1, v8qi)
VAR1 (TERNOP, vtbx2, v8qi)
VAR1 (TERNOP, vtbx3, v8qi)
VAR1 (TERNOP, vtbx4, v8qi)
VAR5 (UNOP, vreinterpretv8qi, v8qi, v4hi, v2si, v2sf, di)
VAR5 (UNOP, vreinterpretv4hi, v8qi, v4hi, v2si, v2sf, di)
VAR5 (UNOP, vreinterpretv2si, v8qi, v4hi, v2si, v2sf, di)
VAR5 (UNOP, vreinterpretv2sf, v8qi, v4hi, v2si, v2sf, di)
VAR5 (UNOP, vreinterpretdi, v8qi, v4hi, v2si, v2sf, di)
VAR6 (UNOP, vreinterpretv16qi, v16qi, v8hi, v4si, v4sf, v2di, ti)
VAR6 (UNOP, vreinterpretv8hi, v16qi, v8hi, v4si, v4sf, v2di, ti)
VAR6 (UNOP, vreinterpretv4si, v16qi, v8hi, v4si, v4sf, v2di, ti)
VAR6 (UNOP, vreinterpretv4sf, v16qi, v8hi, v4si, v4sf, v2di, ti)
VAR6 (UNOP, vreinterpretv2di, v16qi, v8hi, v4si, v4sf, v2di, ti)
VAR6 (UNOP, vreinterpretti, v16qi, v8hi, v4si, v4sf, v2di, ti)
VAR10 (LOAD1, vld1,
        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
VAR10 (LOAD1LANE, vld1_lane,
	v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
VAR10 (LOAD1, vld1_dup,
	v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
VAR10 (STORE1, vst1,
	v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
VAR10 (STORE1LANE, vst1_lane,
	v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
VAR9 (LOAD1, vld2,
	v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf)
VAR7 (LOAD1LANE, vld2_lane,
	v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf)
VAR5 (LOAD1, vld2_dup, v8qi, v4hi, v2si, v2sf, di)
VAR9 (STORE1, vst2,
	v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf)
VAR7 (STORE1LANE, vst2_lane,
	v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf)
VAR9 (LOAD1, vld3,
	v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf)
VAR7 (LOAD1LANE, vld3_lane,
	v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf)
VAR5 (LOAD1, vld3_dup, v8qi, v4hi, v2si, v2sf, di)
VAR9 (STORE1, vst3,
	v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf)
VAR7 (STORE1LANE, vst3_lane,
	v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf)
VAR9 (LOAD1, vld4,
	v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf)
VAR7 (LOAD1LANE, vld4_lane,
	v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf)
VAR5 (LOAD1, vld4_dup, v8qi, v4hi, v2si, v2sf, di)
VAR9 (STORE1, vst4,
	v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf)
VAR7 (STORE1LANE, vst4_lane,
	v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf)
